Множественные сервисы Git на одном компьютере
Множественные сервисы Git на одном компьютере
Одна машина может работать с множеством систем контроля версий одновременно. Конфликт возникает только при неправильной настройке параметров аутентификации и конфигурации удалённых хранилищ.
Использование нескольких платформ позволяет поддерживать разделение между рабочими проектами и личными экспериментами. Компании могут использовать внутреннюю инфраструктуру, а частные лица сохраняют проекты на публичных сервисах.
Системный подход к настройке требует управления ключами доступа и переопределения настроек для каждого репозитория отдельно.
| Преимущество | Описание |
|---|---|
| Разделение проектов | Рабочие задачи и личные исследования не смешиваются |
| Тестирование мигации | Проверка новой платформы без удаления старых данных |
| Бэкап данных | Наличие копий кода на разных географических серверах |
| Доступность | Резервный канал связи при блокировке одного сервиса |
Архитектура настройки ключей
SSH ключ — это пара криптографических файлов для подтверждения личности пользователя при подключении к серверу. Каждый сервис использует свою пару ключей при необходимости полного разделения доступа.
Генерация новых ключей проходит через команду ssh-keygen с указанием имени файла вместо стандартного пути.
# Генерация ключа для GitHub
ssh-keygen -t ed25519 -C "user@github.com" -f ~/.ssh/id_ed25519_github
# Генерация ключа для GitVerse
ssh-keygen -t ed25519 -C "user@gitverse.ru" -f ~/.ssh/id_ed25519_gitverse
Файлы размещаются в директории .ssh домашней папки пользователя. Имя файла определяет назначение ключа при подключении.
Проверка готовности ключей происходит через демонстрацию подключения к обоим серверам.
# Проверка ключа GitHub
ssh -T git@github.com
# Проверка ключа GitVerse
ssh -T git@gitverse.ru
Успешное соединение выводит имя пользователя сервиса. Неудачное соединение указывает на отсутствие правильного ключа или ошибки конфигурации.
Конфигурация клиента SSH
SSH конфиг хранит правила выбора ключа для каждого хостового адреса. Файл находится по пути .ssh/config внутри домашней директории.
Настройка включает определение имени хоста, типа аутентификации и соответствующего файла ключа.
# Настройки для GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes
# Настройки для GitVerse
Host gitverse.ru
HostName gitverse.ru
User git
IdentityFile ~/.ssh/id_ed25519_gitverse
IdentitiesOnly yes
Параметр IdentitiesOnly yes принуждает SSH использовать только указанный файл и игнорировать другие ключи из списка. Это предотвращает случайное подключение не к тем серверам.
Перезагрузка агента SSH активизирует изменения. Команда выполняет удаление всех текущих ключей из памяти и загрузку новых правил.
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_ed25519_github
ssh-add ~/.ssh/id_ed25519_gitverse
Управление удалёнными ссылками
Удалённый источник — это адрес сервера, куда отправляются локальные коммиты. Каждая команда работает с одной конкретной системой при настройке ссылки.
Добавление нового удалённого источника происходит через команду git remote add. Имя ссылки задаёт идентификатор для работы с командой push и pull.
# Добавление основного источника для рабочей задачи
git remote add gitverse https://gitverse.ru/user/repo.git
# Добавление резервного источника для публичного проекта
git remote add github https://github.com/user/repo.git
Список всех источников отображается через опцию -v. Вариант показывает полное URL и краткое название каждой ссылки.
git remote -v
# Вывод:
# gitverse https://gitverse.ru/user/project.git (fetch)
# gitverse https://gitverse.ru/user/project.git (push)
# github https://github.com/user/project.git (fetch)
# github https://github.com/user/project.git (push)
Переключение между источниками происходит вручную перед каждым пушем или фейлом.
# Отправка изменений на GitVerse
git push gitverse main
# Отправка изменений на GitHub
git push github main
Локальный репозиторий содержит историю независимо от выбранного удалённого источника. Команды работают с идентичными объектами.
Переменные окружения системы
Переменные окружения хранят настройки для автоматического выбора ключа при выполнении операций. Их можно задать глобально или локально в зависимости от потребностей проекта.
Глобальная настройка применяется ко всем репозиториям пользователя. Локальная настройка действует только в пределах конкретной директории.
# Глобальная переменная для SSH ключа по умолчанию
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ed25519_github"
# Локальная переменная для конкретного проекта
git config --local core.sshCommand "ssh -i ~/.ssh/id_ed25519_gitverse"
Использование переменных снижает вероятность человеческой ошибки при выборе неправильного ключа. Система автоматически применяет нужные параметры во время выполнения задач.
Открытие терминала после установки переменных делает их доступными для всех процессов внутри этого сеанса. Новые окна не наследуют значения без повторной настройки.
Миграция репозиториев между платформами
Миграция означает перенос всей истории коммитов из одного сервиса в другой без потери метаданных. Процесс сохраняет авторов, даты и сообщения всех ревизий.
Подготовка включает клонирование существующего репозитория с полным флагом.
git clone --mirror https://github.com/user/existing-repo.git
cd existing-repo.git
git remote set-url origin https://gitverse.ru/user/new-repo.git
git push --force
Флаг --mirror копирует полную структуру включая ветки и теги. Операция занимает больше времени при большом количестве объектов в истории.
Проверка результатов выполняется через вывод состояния веток обоих источников. Скрипт сканирует все локальные копии и сверяет их содержимое.
Автоматизация выбора цели
Автоматизация исключает необходимость ручного ввода команды при каждом обновлении кода. Правила определяют приоритет целей в зависимости от ветки или автора коммита.
Шаблоны скриптов анализируют текущее состояние репозитория и выбирают правильную ссылку. Сценарии используют переменные окружения для динамической настройки.
#!/bin/bash
# Определяем целевой хост
TARGET_HOST="github.com"
if grep -q "work-project" .git/config; then
TARGET_HOST="gitverse.ru"
fi
# Выполняем пуш к выбранному хосту
git push origin main
echo "Push завершён на $TARGET_HOST"
Скрипты размещают в директории .git/hooks/ для автоматического вызова перед отправкой. Поддерживается несколько типов триггеров перед коммитом и перед пушем.
Согласование с коллегами команды гарантирует единые правила выбора целевого сервиса. Документация описывает логику выбора и причины использования разных платформ.